package com.solution.admin.product.dao.impl;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.springframework.stereotype.Repository;

import com.solution.admin.product.dao.ProductDao;
import com.solution.admin.product.entity.ProductEntity;
import com.solution.admin.product.entity.ProductSpecCompositionEntity;
import com.solution.admin.product.entity.ProductSpecRelaEntity;
import com.solution.common.dao.impl.BaseDaoImpl;
import com.solution.common.page.PageBean;
import com.solution.common.page.PageParam;

/**
 * 商品信息DAO实现
 * 
 * @author xu_cc
 * @date 2017-08-29 20:09:14
 */
@Repository
public class ProductDaoImpl extends BaseDaoImpl<ProductEntity> implements ProductDao {

    /**
     * 获取关联商品<br/>
     * productId:当前商品ID<br/>
     * type:为空（已选择商品列表），不为空（未关联商品列表）<br/>
     * 
     * @param param
     * @return List<ProductEntity>
     * @author xu_cc
     * @throws Exception
     *             exception
     * @Date 创建时间：2017年9月17日 下午3:22:55
     */
    public List<ProductEntity> listProductRela(Map<String, Object> param) {
        return getSessionTemplate().selectList(getStatement("listProductRela"), param);
    }

    /**
     * 单表获取商品列表<br>
     * 上架状态、符合品牌或者品类条件的<br>
     * type[brand,category]<br>
     * brandCode<br>
     * childBrandCode<br>
     * category<br>
     * 
     * @param pageParam
     *            分页对象
     * @param product
     *            分页参数
     * @return PageBean 分页参数及数据
     * @author xu_cc
     * @date 2017-08-29 20:09:14
     */
    public PageBean listProductForPromotionPage(PageParam pageParam, Map<String, Object> param) {
    	return super.listPage(pageParam, param, "listProductForPromotionPage", "countProductForPromotion");
    }

    /**
     * PC端商品搜索
     * 
     * @param pageParam
     * @param param
     * @return
     */
    public PageBean listProductPageForIndex(PageParam pageParam, Map<String, Object> param) {
        if (param == null) {
            param = new HashMap<String, Object>();
        }
        Integer count = getSessionTemplate().selectOne(getStatement("countListProductPageForIndex"), param);
        List<Object> list = null;
        if (count != null && count > 0) {
            param.put("offset", (pageParam.getPageNum() - 1) * pageParam.getNumPerPage());
            param.put("limit", pageParam.getNumPerPage());
            // 获取分页数据集 , 注切勿换成 sessionTemplate 对象
            list = getSessionTemplate().selectList(getStatement("listProductPageForIndex"), param);
        } else {
        	pageParam.setPageNum(1);
            list = new ArrayList<Object>();
        }
        return new PageBean(pageParam.getPageNum(), pageParam.getNumPerPage(), count, list);
    }

    /**
     * 保存商品信息信息
     * 
     * @param productEntity
     * @return
     * @author xu_cc
     * @date 2017-08-29 20:09:14
     */
    @Override
    public long saveProduct(ProductEntity productEntity) {
        return super.insert(productEntity);
    }

    /**
     * 分页查询商品信息信息
     * 
     * @param pageParam
     *            分页对象
     * @param product
     *            分页参数
     * @return PageBean 分页参数及数据
     * @author xu_cc
     * @date 2017-08-29 20:09:14
     */
    public PageBean listProductPage(PageParam pageParam, Map<String, Object> param) {
        return super.listPage(pageParam, param);
    }

    /**
     * 更新商品信息
     * 
     * @param productEntity
     * @return
     * @author xu_cc
     * @date 2017-08-29 20:09:14
     */
    @Override
    public int updateProduct(ProductEntity productEntity) {
        return super.update(productEntity);
    }
    
    /**
	 * 更新商品排序值及权重
	 * @param product
	 * @return
	 */
	public int updateProductSortNo(ProductEntity product){
		return getSessionTemplate().update(getStatement("updateProductSortNo"), product);
	}

    /**
     * 删除商品信息
     * 
     * @param productId
     * @return
     * @author xu_cc
     * @date 2017-08-29 20:09:14
     */
    public int deleteProductById(Long id) {
        return super.deleteById(id);
    }

    /**
     * 根据条件查询商品信息
     * 
     * @param param
     * @return
     * @author xu_cc
     * @date 2017-08-29 20:09:14
     */
    @Override
    public List<ProductEntity> listProduct(Map<String, Object> param) {
        return getSessionTemplate().selectList(getStatement("listBy"), param);
    }

    /**
     * 为首页配置楼层查询商品信息
     * 
     * @param param
     * @return
     * @author llp
     * @date 2017-08-29 20:09:14
     */
    public List<ProductEntity> listProductForIndex(Map<String, Object> param) {
        return getSessionTemplate().selectList(getStatement("listProductForIndex"), param);
    }

    /**
     * 保存属性筛选表
     * 
     * @Title: saveProductProperty
     * @Description:(描述)
     * @param param
     * @return int
     * @author xu_cc
     * @throws Exception
     *             exception
     * @Date 创建时间：2017年10月13日 上午10:11:30
     */
    public int saveProductProperty(Map<String, Object> param) {
        return getSessionTemplate().insert(getStatement("saveProductProperty"), param);
    }
	
	/**
	 * 查询商品规格项及对应价格
	 * @param param
	 * @return
	 * @author llp
	 * @date 2017-08-29 20:09:14
	 */
	public List<ProductSpecRelaEntity> listProductSpecPriceByProductId(Map<String, Object> param){
		return getSessionTemplate().selectList(getStatement("listProductSpecPriceByProductId"), param);
	}
	
	/**
	 * 查询商品规格项组合
	 * @param param
	 * @return
	 * @author llp
	 * @date 2017-08-29 20:09:14
	 */
	public List<ProductSpecCompositionEntity> listProductSpecCompostionByProductId(Map<String, Object> param){
		return getSessionTemplate().selectList(getStatement("listProductSpecCompostionByProductId"), param);
	}
	
	/**
	 * 查询首页楼层商品的价格
	 * @param param
	 * @return
	 */
	public List<ProductEntity> listFoorProductPrice(Map<String, Object> param){
		return getSessionTemplate().selectList(getStatement("listFoorProductPrice"), param);
	}
	

	/**
	 * 通过存储过程复制商品
	 * @param paramMap
	 * @return
	 * @author xkl
	 * @date 2017年12月20日 下午3:07:07
	 */
	@Override
	public Long copyProduct(Map<String, Object> paramMap) {
		return getSessionTemplate().selectOne(getStatement("callCopyProductProcedure"), paramMap);
	}
	
	
	/**
	 * /**
	 * 查询商品单位 、类型名称 ，用于展示页面合同商品清单 
	 * @param params
	 * @return
	 * @author lilp
	 */
	public List<ProductEntity> listProductForContract(Map<String, Object> params){
		return getSessionTemplate().selectList(getStatement("listProductForContract"), params);
	}
	
	/**
	 * 查询推荐商品
	 * @param params
	 * @return
	 * @author lilp
	 */
	public List<ProductEntity> listProductRelaList(Map<String, Object> params){
		return getSessionTemplate().selectList(getStatement("listProductRelaList"), params);
	}

	/**
	 * 查询模块配置的商品
	 * @param param
	 * @return
	 * @author xkl
	 * @date 2018年1月13日 下午4:39:06
	 */
	@Override
	public List<ProductEntity> listProductForSiteItem(Map<String, Object> param) {
		return getSessionTemplate().selectList(getStatement("listProductForSiteItem"), param);
	}
	
	/**
	 * 查询pc端首页楼层的商品列表
	 * 过滤下架、删除的商品
	 * @param param
	 * @return
	 * @author xkl
	 * @date 2018年1月13日 下午4:26:17
	 */
	public List<ProductEntity> listIndexFloorProduct(Map<String, Object> param){
		return getSessionTemplate().selectList(getStatement("listIndexFloorProduct"), param);
	}

	/**
	 * 查询用户收藏商品
	 * @param param
	 * @return
	 * @author xkl
	 * @date 2018年1月23日 下午7:03:55
	 */
	@Override
	public List<ProductEntity> listUserFavoriteProduct(Map<String, Object> param) {
		return getSessionTemplate().selectList(getStatement("listUserFavoriteProduct"), param);
	}

	/**
	 * 根据商品编码获取商品
	 * @param productCode
	 * @return
	 * @author xkl
	 * @date 2018年1月26日 上午10:39:07
	 */
	@Override
	public ProductEntity getProductByCode(String productCode) {
		return getSessionTemplate().selectOne(getStatement("getProductByCode"), productCode);
	}

	/**
	 * 查询用户浏览记录商品
	 * @param param
	 * @return
	 * @author xkl
	 * @date 2018年2月1日 下午8:14:36
	 */
	@Override
	public List<ProductEntity> listProductBrowseRecord(Map<String, Object> param) {
		return getSessionTemplate().selectList(getStatement("listProductBrowseRecord"), param);
	}
	
	/**
	 * 计算出整个订单商品的默认普通运费多少 ，快递物流运费多少，其它运费多少
	 * @param shoppingcartIds
	 * @return
	 */
	public ProductEntity listShoppingcartProductDelivery(Map<String, Object> param){
		return getSessionTemplate().selectOne(getStatement("listShoppingcartProductDelivery"),param );
	}
	
	/**
	 * 查询商品相关的类型path,从中提取category_ids
	 * @param param
	 * @return
	 */
	public List<ProductEntity> listRelatedProductCategory(Map<String, Object> param){
		return getSessionTemplate().selectList(getStatement("listRelatedProductCategory"), param);
	}
	
	/**
	 * 根据商品ID和商品ID批量获取商品基价
	 * @param paramMap
	 * @return
	 * @author: solin
	 * @date: 2018年4月23日 下午6:59:42
	 */
	public List<ProductEntity> listProductBasePrice(Map<String, Object> paramMap) {
		return getSessionTemplate().selectList("listProductBasePrice", paramMap);
	}

	/**
	 * 根据id集合获取商品列表
	 * @param productList
	 * @return
	 * @author xkl
	 * @date 2018年6月12日 下午6:17:41
	 */
	@Override
	public Map<Long, ProductEntity> listProductMapByIds(List<String> productList) {
		return getSessionTemplate().selectMap(getStatement("listProductMapByIds"), productList, "id");
	}
}
